package com.hugang.aboutclassinitialization;

/**
 * 类初始化过程：
 *  1、一个类要创建实例需要先加载并初始化该类
 *      1）、main方法所在的类需要先加载和初始化
 *  2、子类初始化需要先初始化父类
 *  3、一个类初始化就是执行<clinit>()方法
 *      1）、此方法由静态类变量显示赋值代码和静态代码块组成，这两块代码的执行顺序从上到下，且只执行一次
 *
 * 实例初始化过程：
 *  1、实例初始化就是执行<init>()方法
 *      1）、此方法可能有多个重载方法，有几个构造器就有几个<init>方法
 *      2）、此方法由非静态实例变量显示赋值代码和非静态代码块、对应构造器代码组成
 *      3）、非静态实例变量显示赋值代码和非静态代码块按照从上到下顺序执行，对应构造器最后执行
 *      4）、每次创建实例对象，调用对应构造器，执行的就是对应的<init>方法
 *      5）、<init>方法的首行就是super()或者super(实参列表)，即对应父类的<init>方法
 *
 *
 *  父类的初始化<clinit>
 *  1）、j = method() --> System.out.println("父类静态方法");
 *  2）、静态代码块 ---> System.out.println("父类静态代码块");
 *
 *  父类的实例化方法：
 *  1）、super()
 *  2）、非静态成员变量显示赋值：i = test();
 *      非静态方法前面有一个默认的对象this，this在构造器中（或<init>）表示的是正在创建的对象，所有test()执行的是子类重写的代码
 *      因此结果为 ---> System.out.println("子类非静态成员变量调用的非静态方法");
 *  3）、非静态代码块 ---> System.out.println("父类非静态代码块");
 *  4）、子类的构造器（最后） ---> System.out.println("父类类构造方法");
 *
 *  哪些方法不可以被重写：
 *      1）、final方法
 *      2）、静态方法
 *      3）、private等子类不可见方法
 *  对象的多态性：
 *      1）、子类如果重写了父类的方法，通过子类对象调用的一定是子类重写过的代码
 *      2）、非静态方法默认的调用对象是this
 *      3）、this对象在构造器或者说<init>方法中就是正在创建的对象
 * @author hg
 * @date 2020/8/24 10:16
 */
public class Father {

    private static int j = method();

    static {
        System.out.println("父类静态代码块");
    }

    private int i = test();

    {
        System.out.println("父类非静态代码块");
    }

    Father() {
        System.out.println("父类构造方法");
    }

    public static int method() {
        System.out.println("父类静态成员变量调用的静态方法");
        return 1;
    }

    public int test() {
        System.out.println("父类非静态成员变量调用的非静态方法");
        return 1;
    }

}
